以下是前20個SwiftUI中的屬性包裝器 使用場合及範例程式碼:
屬性包裝器 | 描述 | 使用場合 | 程式範例 |
---|---|---|---|
@State |
管理視圖內部的局部狀態,當狀態變更時,視圖會自動重新渲染。 | 單一視圖內部的狀態管理,如按鈕狀態、表單輸入。 | @State private var isOn: Bool = false var body: some View { Toggle("Switch", isOn: $isOn) } |
@Binding |
允許子視圖修改父視圖的狀態,透過雙向綁定狀態。 | 當子視圖需要修改父視圖的狀態時使用。 | struct ChildView: View { @Binding var isOn: Bool var body: some View { Toggle("Switch", isOn: $isOn) } } |
@StateObject |
初始化並管理ObservableObject ,視圖負責管理物件的生命週期。 |
在視圖內建立並持有ViewModel等狀態物件。 | class ViewModel: ObservableObject { @Published var count = 0 } struct ContentView: View { @StateObject var viewModel = ViewModel() var body: some View { Text("\(viewModel.count)") } } |
@ObservedObject |
監控外部的ObservableObject ,當物件的狀態變更時通知視圖更新。 |
當父視圖需要傳遞物件給子視圖進行觀察時。 | class ViewModel: ObservableObject { @Published var count = 0 } struct ParentView: View { @ObservedObject var viewModel = ViewModel() var body: some View { ChildView(viewModel: viewModel) } } |
@EnvironmentObject |
將物件放置在環境中,使子視圖可以訪問並共享該物件。 | 當多個視圖需要共享相同資料,但不希望手動傳遞時。 | class UserSettings: ObservableObject { @Published var username: String = "User" } struct ContentView: View { @EnvironmentObject var settings: UserSettings var body: some View { Text(settings.username) } } |
@Published |
用於自訂的ObservableObject 類型內,當屬性變更時通知觀察者。 |
定義在ObservableObject 內,標記會影響視圖的狀態屬性。 |
class ViewModel: ObservableObject { @Published var count = 0 } |
@Environment |
提供從環境中提取系統相關的值,如配色方案、顯示比例等。 | 需要訪問系統環境資料,如裝置的設定或環境狀態時。 | @Environment(\.colorScheme) var colorScheme |
@AppStorage |
用戶預設存儲的包裝器,讓SwiftUI視圖自動綁定到UserDefaults 。 |
當需要將簡單數據持久化並在App中保持共享狀態時使用。 | @AppStorage("username") var username: String = "" |
@SceneStorage |
與@AppStorage 類似,但專門用於儲存場景(scene)特定的狀態。 |
儲存應用程序在多個場景中各自的狀態,如在iPad上多個場景。 | @SceneStorage("textFieldContent") var text: String = "" |
@FetchRequest |
與Core Data整合,透過此包裝器進行資料的查詢操作。 | 在SwiftUI中直接綁定Core Data資料查詢結果到視圖。 | @FetchRequest(entity: User.entity(), sortDescriptors: []) var users: FetchedResults<User> |
@FocusState |
控制視圖的焦點狀態,特別是用於表單輸入中的焦點管理。 | 需要動態控制表單輸入欄位的焦點時。 | @FocusState private var isFocused: Bool |
@GestureState |
管理手勢的中間狀態,當手勢改變時更新其值。 | 當需要管理長按、拖動等手勢的狀態時。 | @GestureState private var dragOffset: CGSize = .zero |
@MainActor |
確保程式碼在主執行緒上執行,特別是需要更新UI的程式碼。 | 當進行需要更新UI的非同步操作時。 | @MainActor func updateUI() { } |
@NSManaged |
用於Core Data的屬性,標記需要由Core Data管理的屬性。 | 在Core Data中使用,用來聲明由Core Data處理的屬性。 | @NSManaged var name: String |
@UIApplicationDelegateAdaptor |
允許將UIApplicationDelegate 適配到SwiftUI中。 |
需要將應用程式委派的生命週期事件整合到SwiftUI時。 | @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate |
@ViewBuilder |
用來構建複雜的視圖層次結構,允許返回多個視圖。 | 當視圖需要動態構建且包含多個子視圖時使用。 | @ViewBuilder var body: some View { Text("Hello") Text("World") } |
@ScaledMetric |
允許開發者依據用戶設置的動態字體大小來縮放視圖中的數字。 | 需要根據用戶字體設置動態調整數值大小時。 | @ScaledMetric var scale: CGFloat = 1.0 |
@Namespace |
用來建立動畫的命名空間,特別是matchedGeometryEffect 動畫。 |
用於在兩個視圖間進行動畫過渡。 | @Namespace var animationNamespace |
@AttributedStringBuilder |
允許構建富文本內容。 | 當需要在SwiftUI中使用富文本(多樣式文本)時使用。 | @AttributedStringBuilder var attributedText: AttributedString { ... } |
這些屬性包裝器從管理局部狀態(@State
、@Binding
),到處理複雜資料模型(@StateObject
、@ObservedObject
、@EnvironmentObject
),再到處理系統環境和持久化數據(如@AppStorage
、@SceneStorage
、@Environment
),幫助SwiftUI開發者更輕鬆地管理狀態、資料流和環境設置。
多的不只這些常用的列進去
!!!這包裝屬性是SwiftUI精神靈魂!!!做此表謹記備查